/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ihmprojet.core.historique;

/**
 *
 * @author Rémi PIOTAIX <remi.piotaix@gmail.com>
 */
public abstract class AbstractAction implements ActionInterface {

    private ActionState state = ActionState.CREATED;

    @Override
    public abstract String getNom();

    /**
     * Méthode a redefinir pour détailler le cmportement lors de l'execution de
     * l'action. Attention, cette méthode est appelée autant lors de la première
     * execution que lors d'un 'redo' après une annulation.
     */
    public abstract void doExecute();

    /**
     * Methode a redefinir pour détailler le comportement lors de l'annulation.
     * de l'action
     */
    public abstract void doReverse();

    /**
     * Methode a redefinir si il est necessaire d'initialiser l'action avant la
     * première execution. Attention, cette methode n'est executee qu'une fois
     * juste avant la première execution de l'action
     */
    protected void doInitialize() {
    }

    @Override
    public void execute() {
        if (state == ActionState.EXECUTED || !canExecute()) {
            return;
        }

        if (!isInitialized()) {
            initialize();
        }

        doExecute();
        state = ActionState.EXECUTED;
    }

    @Override
    public void reverse() {
        if (state != ActionState.EXECUTED || !canReverse()) {
            return;
        }

        doReverse();
        state = ActionState.REVERSED;
    }

    @Override
    public ActionState getState() {
        return state;
    }

    public boolean isInitialized() {
        return state != ActionState.CREATED;
    }

    private void initialize() {
        state = ActionState.INITIALIZED;
        doInitialize();
    }
}
